Technical Q&A QA1195
Retain Counts of io_object_t Objects in IOKit.framework


Q: ÉÜÅ[ÉUãÛä‘Çà I/O Kit ÉRÅ[Éhì‡Ç≈ io_object_t ÉIÉuÉWÉFÉNÉgÇÉäÅ[ÉNǵǃǢÇÈÇÊǧDžévǢNjÇ∑ÅBä÷êî IOObjectGetRetainCount ÇégópǵǃDZÇÍÇÁÇÃÉIÉuÉWÉFÉNÉgÇÃï€éùÉJÉEÉìÉgÇéÊìæÇµÇ‹ÇµÇΩÇ™ÅAó\ëzÇÊÇËLJëÂÇ´Ç¢ílÇ™ñflÇ≥ÇÍÇÈÇÃÇ≈Ç∑ÅBDZÇÍÇÕÇ»Ç∫Ç≈Ç∑Ç©ÅH

A: DZDZÇ≈ä÷òAÇ∑ÇÈï€éùÉJÉEÉìÉgÇÕÅAé¿ç€Ç…ÇÕ 2 ǬdžÇËÇ‹Ç∑ÅB1 ǬÇÕÅAio_object_t Ç…ÇÊǡǃï\åªÇ≥ÇÍÇÈÅAäÓî’ÇÃÉJÅ[ÉlÉãÉIÉuÉWÉFÉNÉgÇÃï€éùÉJÉEÉìÉgÇ≈Ç∑ÅBä÷êî IOObjectGetRetainCount ÇÕÅAÉJÅ[ÉlÉãÇåƒÇ—èoÇ∑DZÇΔÇ…ÇÊǡǃÅADZÇÃï€éùÉJÉEÉìÉgÇñflǵNjÇ∑ÅB

LJǧ 1 ǬÇÕÅAio_object_t é©êgÇÃï€éùÉJÉEÉìÉgÇ≈Ç∑ÅBio_object_t ÇÕÅAÉÜÅ[ÉUãÛä‘ÇΔÉJÅ[ÉlÉãÇΔÇÃÇ‚ÇËéÊÇËégÇÌÇÍÇÈ Mach É|Å[ÉgÇÃÉâÉbÉpÅ[Ç≈džÇËÅAMach É|Å[ÉgÇÕǪÇÍǺÇÍêÍópÇÃï€éùÉJÉEÉìÉgÇéùǡǃǢNjÇ∑ÅBDZÇÍÇÕÅAio_object_t Ç©ÇÁîhê∂ǵÇΩëºÇÃå^ÅAÇ∑Ç»ÇÌÇø io_service_tÅAio_connect_tÅAio_iterator_tÅAio_registry_entry_tÅAio_enumerator_t DžLJìñǃÇÕÇ‹ÇËÇ‹Ç∑Å@(DZÇÍÇÁÇÃå^ÇÕÅAIOKit/IOTypes.h ÇÃíÜÇ≈íËã`Ç≥ÇÍǃǢNjÇ∑)ÅB

IOObjectRetain ÇΔ IOObjectRelease ÇÕÅAio_object_t Çà Mach É|Å[Égé©êgÇÃï€éùÉJÉEÉìÉgÇëŒè€Ç…èàóùÇçsǢNjÇ∑ÅBDZÇÍÇÕÅADarwin Çà IOKitUser ÉvÉçÉWÉFÉNÉgÇÃíÜÇà IOKitLib.c Çí≤Ç◊ÇÈDZÇΔÇ≈ämîFÇ≈Ç´Ç‹Ç∑ÅB

ǵÇΩǙǡǃÅAio_object_t ÇÃï€éùÉJÉEÉìÉgÇéÊìæÇ∑ÇÈê≥ǵǢï˚ñ@ÇÕÅAMach ä÷êî mach_port_get_refs ÇÅAÉäÉXÉg 1 ÇÃÇÊǧDžégópÇ∑ÇÈDZÇΔÇ≈Ç∑ÅB

#include <IOKit/IOKitLib.h>
#include <mach/mach_port.h>

kern_return_t  kr;
unsigned int    result;
io_object_t theObject;
io_name_t className;

kr = IOObjectGetClass(theObject, className);
if (KERN_SUCCESS == kr)
{
    kern_return_t  kr2;
    kr2 = mach_port_get_refs(
        mach_task_self(),
        theObject,
        MACH_PORT_RIGHT_SEND,
        &result );
    printf(
        "ID: %#X, Class: %s, Retain Count: %d, Result=%#x\n",
        theObject, className, result, kr2);
}

ÉäÉXÉg 1Å@io_object_t ÇÃï€éùÉJÉEÉìÉgÇÃéÊìæ


ÇÊÇ≠ímÇÁÇÍǃǢÇÈÉäÉ^Å[ÉìÉRÅ[Éh 0x10000003 (MACH_SEND_INVALID_DEST) Ç™ IOKit.framework ä÷êîÇ©ÇÁñflÇ≥ÇÍÇΩèÍçáÅADZÇÍÇÕÅAäÓî’ÇÃÉJÅ[ÉlÉãÉIÉuÉWÉFÉNÉgÇ≈ÇÕÇ»Ç≠ÅAîjä¸Ç≥ÇÍÇΩ io_object_t ÇéQèΔǵǃǢNjÇ∑ÅBI/O Kit ÇÃÉGÉâÅ[ÉRÅ[ÉhÇÃè⁄ç◊DžǬǢǃÇÕÅAÉeÉNÉjÉJÉã Q&A 1075 ÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB


[2002 îN 9 åé 4 ì˙]